Skip to content

round palette bit depth up for png and gif colours#4569

Merged
lovell merged 1 commit into
lovell:mainfrom
metsw24-max:palette-bitdepth-round-up
Jul 16, 2026
Merged

round palette bit depth up for png and gif colours#4569
lovell merged 1 commit into
lovell:mainfrom
metsw24-max:palette-bitdepth-round-up

Conversation

@metsw24-max

Copy link
Copy Markdown
Contributor

Palette bit depth rounds down instead of up

bitdepthFromColourCount maps the colours option to a PNG/GIF palette bit depth of 1, 2, 4 or 8, but it rounds the required bit count down to the nearest power of two, so a value needing 5 to 8 bits is capped at 4 and one needing 3 bits at 2. png({ colours: 128 }) and gif({ colours: 100 }) therefore emit a 16-entry palette, and colours: 8 a 4-entry one, quietly discarding colours the caller asked to keep (visible via metadata bitsPerSample). Rounding up instead keeps the stored depth one of 1/2/4/8 while making it large enough to hold the requested count.

The reduced-colours GIF size test happened to depend on the old behaviour, as colours: 128 only shrank the file because it collapsed to 16 entries, so it now uses colours: 16 which still exercises a genuinely smaller palette. Added a PNG regression test asserting the written bit depth can represent the requested number of colours.

@lovell
lovell merged commit 11e89a2 into lovell:main Jul 16, 2026
32 checks passed
@lovell

lovell commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Thanks for fixing this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants